#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <stdio.h>
#include "lcd.h"

int *plcd;
int lcd_fd = -1;

//初始化LCD屏幕：打开帧缓冲设备 映射
void init_lcd()
{
    //打开帧缓冲设备
    lcd_fd = open(LCD_PATH, O_RDWR);
    if (-1 == lcd_fd)
    {
        perror("open lcd failed");
		return ;
    }

    plcd = mmap(NULL, 480*800*4, PROT_READ|PROT_WRITE, 
                MAP_SHARED, lcd_fd, 0);
    if (NULL == plcd)
    {
        perror("mmap fail");
        return ;
    }
	
}

//解初始化屏幕
void uninit_lcd()
{
    munmap(plcd, 480*800*4);
    plcd = NULL;
    close(lcd_fd);
}

/*
功能：在lcd屏幕上画点
参数：
	x,y:画点的坐标
	color：颜色
返回值：
	0	画点失败
	1	画点成功
*/
int lcd_draw_point(int x, int y, int color)
{
	//判断有没有映射成功
    if (NULL == plcd)
    {
        return 0;
    }
	
	//判断这个坐标在不在屏幕中
    if (x>=0 && x<800 && y>=0 && y<480)
        *(plcd+800*y+x) = color;
    else
        return 0;

    return 1;
}

/*
功能：在lcd屏幕上画矩形
参数：
	x0,y0:矩形在lcd中显示的的起始位置
	width:矩形的宽
	height:矩形的高
	color：颜色
返回值：
	0	失败
	1	成功
*/
int lcd_draw_rectangel(int x0, int y0, int width, int hight, int color)
{
    int i, j;
    for (j=y0; j<y0+hight; j++)
    {
        for (i=x0; i<x0+width; i++)
        {
            if (!lcd_draw_point(i, j, color))
            {
                return 0;
            }
        }
    }

    return 1;
}

/*
功能：在lcd屏幕上画圆
参数：
	x0,y0:圆心坐标
	r:圆的半径
	color：颜色
返回值：
	0	失败
	1	成功
*/
void lcd_draw_circle(int x0, int y0, int r, int color)
{
    int i, j;
    for (j=y0-r; j<y0+r; j++)
    {
        for (i=x0-r; i<x0+r; i++)
        {
            if ((i-x0)*(i-x0)+(j-y0)*(j-y0) <= r*r)
            {
                lcd_draw_point(i, j, color);
            }
        }
    }
}

/*
功能：在lcd屏幕上画太极图
参数：
	x0,y0:太极图圆心坐标
	r:太极图的半径
	color：颜色
*/
void lcd_draw_taijitu(int x0, int y0, int r)
{
    int i, j;
    for (j=y0-r; j<y0+r; j++)
    {
        for (i=x0-r; i<x0+r; i++)
        {
            if ((i-x0)*(i-x0)+(j-y0)*(j-y0) <= r*r)
            {
                if (i <= x0)
                    lcd_draw_point(i, j, 0x000000);
                    
                if(i>x0)
                    lcd_draw_point(i, j, 0xffffff);
            }
        }
    }

    for (j=y0-r; j<y0; j++)
    {
        for (i=x0-r/2; i<x0+r/2; i++)
        {
            if ((i-x0)*(i-x0)+(j-(y0-r/2))*(j-(y0-r/2)) <= (r/2)*(r/2))
            {
                if (i > x0)
                lcd_draw_point(i, j, 0x000000);
            }
        }
    }

    for (j=y0; j<y0+r; j++)
    {
        for (i=x0-r/2; i<x0+r/2; i++)
        {
            if ((i-x0)*(i-x0)+(j-(y0+r/2))*(j-(y0+r/2)) <= (r/2)*(r/2))
            {
                if (i <= x0)
                lcd_draw_point(i, j, 0xffffff);
            }
        }
    }

}